//
// Created by liuf on 2018/8/16.
//

#include "OrgClientEvnCfg.h"
#include <QSettings>
#include <QDir>
#include <QDebug>
#include <windows.h>

void OrgClientEvnCfg::onSaveEnv(QString installDir, QString charset) {
    QSettings env(QLatin1String("HKEY_CURRENT_USER\\Environment"),
                  QSettings::NativeFormat);                 // 取环境变量

    QString installPath = QDir::toNativeSeparators(installDir);   // 取当前设置的安装路径; QDir::​toNativeSeparators 将目录分割符转为Windows下的"\"

    qDebug() << "onSaveEnv::installPath" <<installPath;
    //设置环境变量"TNS_ADMIN"和"Path";
    if (!installPath.isEmpty()){
//        env.setValue(QStringLiteral("TNS_ADMIN"), installPath);             // 设置"TNS_ADMIN"变量
        env.remove(QStringLiteral("TNS_ADMIN"));
        setEnvValue(QStringLiteral("TNS_ADMIN"), installPath);           // 设置"TNS_ADMIN"变量
        QString envPath = env.value(QStringLiteral("Path"), "").toString(); // 取"Path"变量
        // 设置"Path"变量
        if (envPath.isEmpty()){     // "Path"变量为空
//            env.setValue(QStringLiteral("Path"), installPath + QLatin1Literal(";"));
            setEnvValue(QStringLiteral("Path"), QStringLiteral("%TNS_ADMIN%;"));
        } else {                    // "Path"变量非空
            // 检查Path中是否已经包含了安装路径
            QStringList sl = envPath.split(QStringLiteral(";"));        // 按";"将Path分解成QStringList
            bool isExist = false;
                    foreach (const QString &str, sl){
                    if (str == QLatin1String("%TNS_ADMIN%")){
                        isExist = true;
                        break;
                    }
                }

            // 不包含该路径
            if (!isExist){\
                if (envPath.right(1) != QLatin1String(";")){   // 检查Path最后一位是否是";"
                    envPath += ";";
                }
//                env.setValue(QStringLiteral("Path"), envPath + installPath + QLatin1Literal(";"));
                setEnvValue(QStringLiteral("Path"), envPath + QLatin1String("%TNS_ADMIN%;"));
            }
        }
    }
    // 设置NLS_LANG变量
//    QString charset = ui->comboBoxLang->currentText();     // 取当前设置的字符集
    if (!charset.isEmpty()){
        env.setValue(QStringLiteral("NLS_LANG"), charset);
    }

    qDebug() << "保存完成";
}

void OrgClientEvnCfg::onRemoveEnv() {

    QSettings env(QLatin1String("HKEY_CURRENT_USER\\Environment"),
                  QSettings::NativeFormat);                 // 取环境变量

    QString tns_admin = env.value (QStringLiteral("TNS_ADMIN"), "").toString ();    // 取TNS_ADMIN
    env.remove(QStringLiteral("TNS_ADMIN"));    // 删除 TNS_ADMIN
    env.remove(QStringLiteral("NLS_LANG"));     // 删除 NLS_LANG
    QString envPath = env.value(QStringLiteral("Path"), "").toString(); // 取"Path"变量
    // 处理Path变量
    if (!envPath.isEmpty()){    // "Path"变量非空
        // 检查Path中是否已经包含了安装路径
        QStringList sl = envPath.split(QStringLiteral(";"));        // 按";"将Path分解成QStringList
        bool isExist = false;
                foreach (const QString &str, sl){
                if (str == QLatin1String("%TNS_ADMIN%") || str == tns_admin){
                    isExist = true;
                    break;
                }
            }
        // 不包含该路径
        if (isExist){\
            if (envPath.right(1) != QLatin1String(";")){   // 检查Path最后一位是否是";"
                envPath += ";";
            }
            // 将路径替换为空
            envPath.replace(QStringLiteral("%TNS_ADMIN%;"),QStringLiteral(""));
            envPath.replace(tns_admin, QStringLiteral(""));
            setEnvValue(QStringLiteral("Path"), envPath);
        }
    }
    qDebug() << "卸载完成";
}

bool OrgClientEvnCfg::setEnvValue(const QString key, const QString keyValue) {
    qDebug() << key << " | " << keyValue << endl;
    HKEY hkey;
    LPCSTR subkey = "Environment";
    int rtn = RegOpenKeyExA(HKEY_CURRENT_USER,subkey,0,KEY_ALL_ACCESS, &hkey);
    if (ERROR_SUCCESS != rtn){
        qDebug() << "打开注册表失败";
        return false;
    }

    char * pkey = qstrdup(key.toLatin1().data());
    qDebug() << "pkey" << pkey << endl;
    LPCSTR keyName = pkey;
    qDebug() << "keyName" << keyName << endl;
    char * value = NULL;
    value = qstrdup(keyValue.toLatin1().data());
    qDebug() << "value" << value;
    DWORD valueLen = strlen(keyValue.toLatin1().data())+ 1;
    if (ERROR_SUCCESS !=RegSetValueExA(hkey, keyName,0,REG_EXPAND_SZ, (const LPBYTE)value,valueLen)){
        delete[] value;
        qDebug() << "注册表写入失败";
        return false;
    }
    delete[] value;
    delete[] pkey;
    return true;
}
